<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Usr extends Model {
    
    public $id    = 0;
    public $login = 'unknown';
    public $group = 1;
    
    private $perfix = 'user_';
    private $logged = false;
    private $rights = array();
    
    public $for_guest = 1;
    public $for_register = 2;
    
    function Usr() {
        
        parent::Model();
        
        $this->start_session();
    }
    
    
    /**
     * Запуск сесии
     * @return void
     */
    private function start_session() {
        
        //Существует ли запись в куках
        if( !$this->input->cookie($this->config->item('sess_cookie_name')) ) {
            return false;
        }
        
        if ( ($this->session->userdata('last_activity') + $this->config->item('sess_expiration')) < time() ) {
            return false;   
        }    
        
        //Получаем данные из куков
        $login = $this->session->userdata('login');
        $pass = $this->session->userdata('password');
        
        if ( $login === false AND $pass === false ) {
            
            return false;
        }
        
        //Получаем данные о пользователе из БД
        $user = $this->get($login);
        
        if ( $user->num_rows() != 1 ) {
            return false;
        }
        
        //Устанавливаем свойства
        foreach ($user->row_array() as $k => $v) {
            
            $k = substr($k, strlen($this->perfix));
            $this->$k = $v;
        }
        
        //Проверяем правильность пароля
        if ( $this->encode_password($pass) != $this->password ) {
            return false;
        }
        
        //Устанавливаем флаг что пользователь залогинен
        $this->logged = true;
        $this->password = NULL;
        return true;
    }
    
    
    /**
     * Залогинен пользователь или нет
     * @return boolean
     */
    public function is_logged() {
        
        return $this->logged;
    }
    
    
    /**
     * Загрузка данных о пользователе
     * @param string Данные для поиска
     * @param string Поле по которому осуществлять поиск
     * @return void
     */
    public function get($name, $field = 'user_login') {
        
        return $this->db->get_where('users', array($field => $name));
    }
        
    
    /**
     * Шифрование пароля
     * @param string $pass
     * @return string
     */
    public function encode_password($pass) {
        
        return sha1('MaFJH$&HadF&*#IFIsd'.$pass.$this->config->item('encryption_key'));
    }
    
    
    /**
     * Загрузка прав из БД
     * @return void
     */
    public function get_rights() {
        
        //Если нет в кэше
        if ($this->config->item('user', 'core_main') === false) {
            
            $is_guest = 1; $is_register = 2;
            
            $this->db->join('groups', 'groups.id = rights.role');
            $query = $this->db->get('rights');
            
            foreach($query->result_array() as $row) {
                
                if ($row['is_guest']) {
                    
                    $is_guest = $row['id'];
                }
                
                if ($row['is_register']) {
                    
                    $is_register = $row['id'];
                }
                
                $result[$row['id']][$row['uri']] = array('is_view' => $row['is_view'], 'is_write' => $row['is_view'], 'is_admin' => $row['is_admin']);
            }
            
            $return['rights'] = $result;
            $return['is_guest'] = $is_guest;
            $return['is_register'] = $is_register;
            
            $this->config->set_core('user', $return);
        }
        
        //Выбираем данные из кэша
        $array = $this->config->item('user', 'core_main');
        
        $this->rights = $array['rights'];
        $this->for_guest = $array['is_guest'];
        $this->for_register = $array['is_register'];
        
        if (!$this->logged) {
            
            $this->group = $this->for_guest;
        }
    }
    
    
    /**
     * Проверка прав
     * @param string $action Вид действия
     * @param string $page Страница или путь
     * @return boolean Если доступ разрешён TRUE, если нет FALSE
     */
    public function check_rights($action = 'view', $page = false) {
        
        if ($page === false) {
            
            $page = $this->uri->modul_segments_array();
        }
        else {
            
            $page = explode('/', $page);
        }
        
        if ($action == 'view') {
            
            if (!in_array('www', $page)) {
            
                $page = array_merge(array('www'), $page);
            }
        
            foreach ($page as $row) {
                
                if (empty($row)) continue;
                
                if (!isset($this->rights[$this->group][$row])) {
                    
                    return false;
                }
                
                if (!$this->rights[$this->group][$row]['is_'.$action]) {
                    
                    return false;
                }
            }
            
            return true;
        }
        
        $page = end($page);
        
        if (!isset($this->rights[$this->group][$page])) {
            
            return false;
        }
        
        if (!$this->rights[$this->group][$page]['is_'.$action]) {
            
            return false;
        }
        
        return true;
    }
}
?>